Linux 命令- sar

        sar(System ActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。它不同于其他系统状态监控工具的地方在于,它可以打印历史信息,可以显示当天从零点开始到当前时刻的系统状态信息。如果你系统没有安装这个命令,请使用 yum install -y sysstat 命令安装。初次使用sar命令会报错,那是因为sar工具还没有生成相应的数据库文件(时时监控就不会了,因为不用去查询那个库文件)。它的数据库文件在 “/var/log/sa/” 目录下,默认保存一个月。

命令格式

1
sar [选项] [时间间隔] [次数]

命令选项

        sar命令的选项很多,下面只列出常用选项:

  • -A:所有报告的总和

  • -b:显示I/O和传递速率的统计信息

  • -B:显示换页状态

  • -d:输出每一块磁盘的使用信息

  • -e:设置显示报告的结束时间

  • -f:从制定的文件读取报告

  • -i:设置状态信息刷新的间隔时间

  • -P:报告每个CPU的状态

  • -R:显示内存状态

  • –u:输出cpu使用情况和统计信息

  • –v:显示索引节点、文件和其他内核表的状态

  • -w:显示交换分区的状态

  • -x:显示给定进程的装

  • -r:报告内存利用率的统计信息

使用实例

实例1:统计CPU的使用情况,每间隔1秒钟统计一次,总共统计三次

        命令

1
sar -u 1 3

        输出

1
2
3
4
5
6
7
8
[root@localhost ~]# sar -u 1 3
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时27分59秒 CPU %user %nice %system %iowait %steal %idle
13时28分00秒 all 0.00 0.00 0.50 0.00 0.00 99.50
13时28分01秒 all 0.00 0.00 0.25 0.00 0.00 99.75
13时28分02秒 all 0.25 0.00 1.00 0.50 0.00 98.26
平均时间: all 0.08 0.00 0.58 0.17 0.00 99.17

        说明

  • #%user #用户空间的CPU使用

  • #%nice 改变过优先级的进程的CPU使用率

  • #%system 内核空间的CPU使用率

  • #%iowait CPU等待IO的百分比

  • #%steal 虚拟机的虚拟机CPU使用的CPU

  • #%idle 空闲的CPU

        在以上的显示当中,主要看%iowait和%idle,%iowait过高表示存在I/O瓶颈,即磁盘IO无法满足业务需求,如果%idle过低表示CPU使用率比较严重,需要结合内存使用等情况判断CPU是否瓶颈。

实例2:每个CPU的使用状态

        命令

1
sar -p 1 3

        输出

1
2
3
4
5
6
7
8
[root@localhost ~]# sar -p 1 3
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时31分16秒 CPU %user %nice %system %iowait %steal %idle
13时31分17秒 all 0.00 0.00 0.25 0.00 0.00 99.75
13时31分18秒 all 0.25 0.00 0.50 0.00 0.00 99.26
13时31分19秒 all 0.00 0.00 0.25 0.00 0.00 99.75
平均时间: all 0.08 0.00 0.33 0.00 0.00 99.58

        说明

  • #CPU 所有CPU的统计

  • #%user 用户态的CPU使用统计

  • #%nice 更改过优先级的进程的CPU使用统计

  • #%iowait CPU等待IO数据的百分比

  • #%steal 虚拟机的vCPU占用的物理CPU的百分比

  • #%idle 空闲的CPU百分比

实例3:查看平均负载

        命令

1
sar -q

        输出

1
2
3
4
5
6
7
[root@localhost ~]# sar -q 2 2
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时35分07秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
13时35分09秒 0 167 0.00 0.00 0.00
13时35分11秒 0 167 0.00 0.00 0.00
平均时间: 0 167 0.00 0.00 0.00

        说明

  • #runq-sz 运行队列的长度(等待运行的进程数,每核的CP不能超过3个)

  • #plist-sz 进程列表中的进程(processes)和线程数(threads)的数量

  • #ldavg-1 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推

  • #ldavg-5 最后5分钟的CPU平均负载

  • #ldavg-15 最后15分钟的CPU平均负载

实例4:查看内存使用情况

        命令

1
sar -r

        输出

1
2
3
4
5
6
7
[root@localhost ~]# sar -r 1 2
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时38分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
13时38分02秒 1507864 398688 20.91 19632 176552 237716 3.90
13时38分03秒 1507864 398688 20.91 19632 176552 237716 3.90
平均时间: 1507864 398688 20.91 19632 176552 237716 3.90

        说明

  • #kbmemfree 空闲的物理内存大小

  • #kbmemused 使用中的物理内存大小

  • #%memused 物理内存使用率

  • #kbbuffers 内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.

  • #kbcached 缓存的文件大小

  • #kbcommit 保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)

  • #commit 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

实例5:查看系统swap分区的统计信息

        命令

1
sar -W

        输出

1
2
3
4
5
6
7
[root@localhost ~]# sar -W 1 2
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时40分51秒 pswpin/s pswpout/s
13时40分52秒 0.00 0.00
13时40分53秒 0.00 0.00
平均时间: 0.00 0.00

        说明

  • #pswpin/s 每秒从交换分区到系统的交换页面(swap page)数量

  • #pswpott/s 每秒从系统交换到swap的交换页面(swap page)的数量

实例6:查看I/O和传递速率的统计信息

        命令

1
sar -b

        输出

1
2
3
4
5
6
7
8
[root@localhost ~]# sar -b 1 3
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时43分10秒 tps rtps wtps bread/s bwrtn/s
13时43分11秒 0.00 0.00 0.00 0.00 0.00
13时43分12秒 0.00 0.00 0.00 0.00 0.00
13时43分13秒 0.00 0.00 0.00 0.00 0.00
平均时间: 0.00 0.00 0.00 0.00 0.00

        说明

  • #tps 磁盘每秒钟的IO总数,等于iostat中的tps

  • #rtps 每秒钟从磁盘读取的IO总数

  • #wtps 每秒钟从写入到磁盘的IO总数

  • #bread/s 每秒钟从磁盘读取的块总数

  • #bwrtn/s 每秒钟此写入到磁盘的块总数

实例7:磁盘使用详情统计

        命令

1
sar -d

        输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# sar -d 1 3
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时45分57秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
13时45分58秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时45分58秒 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时45分58秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
13时45分59秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时45分59秒 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时45分59秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
13时46分00秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时46分00秒 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
平均时间: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

        说明

  • #DEV 磁盘设备的名称,如果不加-p,会显示dev253-0类似的设备名称,因此加上-p显示的名称更直接

  • #tps:每秒I/O的传输总数

  • #rd_sec/s 每秒读取的扇区的总数

  • #wr_sec/s 每秒写入的扇区的 总数

  • #avgrq-sz 平均每次次磁盘I/O操作的数据大小(扇区)

  • #avgqu-sz 磁盘请求队列的平均长度

  • #await 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间

  • #svctm I/O的服务处理时间,即不包括请求队列中的时间

  • #%util I/O请求占用的CPU百分比,值越高,说明I/O越慢

实例8:进程、inode、文件和锁表状态

        命令

1
sar -v

        输出

1
2
3
4
5
6
7
8
[root@localhost ~]# sar -v 1 3
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时49分02秒 dentunusd file-nr inode-nr pty-nr
13时49分03秒 16295 672 12498 2
13时49分04秒 16295 672 12498 2
13时49分05秒 16295 672 12498 2
平均时间: 16295 672 12498 2

        说明

  • #dentunusd 在缓冲目录条目中没有使用的条目数量

  • #file-nr 被系统使用的文件句柄数量

  • #inode-nr 已经使用的索引数量

  • #pty-nr 使用的pty数量

        这里面的索引和文件句柄值不是ulimit -a查看到的值,而是sysctl.conf里面定义的和内核相关的值, max-file表示系统级别的能够打开的文件句柄的数量, 而ulimit -n控制进程级别能够打开的文件句柄的数量,可以使用sysctl -a | grep inode和sysctl -a | grep file查看,具体含义如下:

        file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别, kernel-level)。 (The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate)。当收到”Too many open files in system”这样的错误消息时, 就应该曾加这个值了。

1
2
3
# cat /proc/sys/fs/file-max
4096
# echo 100000 > /proc/sys/fs/file-max

        或者

1
2
# echo ""fs.file-max=65535" >> /etc/sysctl.conf
# sysctl -p

        file-nr 可以查看系统中当前打开的文件句柄的数量。 他里面包括3个数字: 第一个表示已经分配了的文件描述符数量, 第二个表示空闲的文件句柄数量, 第三个表示能够打开文件句柄的最大值(跟file-max一致)。 内核会动态的分配文件句柄, 但是不会再次释放他们(这个可能不适应最新的内核了, 在我的file-nr中看到第二列一直为0, 第一列有增有减)

        man bash, 找到说明ulimit的那一节:提供对shell及其启动的进程的可用资源(包括文件句柄, 进程数量, core文件大小等)的控制。 这是进程级别的, 也就是说系统中某个session及其启动的每个进程能打开多少个文件描述符, 能fork出多少个子进程等… 当达到上限时, 会报错”Too many open files”或者遇上Socket/File: Can’t open so many files等

1
2
3
4
5
[root@localhost ~]# sysctl fs.file-nr
fs.file-nr = 672 0 187015
You have new mail in /var/spool/mail/root
[root@localhost ~]# sysctl -a | grep fs.file-nr
fs.file-nr = 672 0 187015

实例9:统计网络信息

        命令

1
sar -n

        sar -n选项使用6个不同的开关:DEV,EDEV,NFS,NFSD,SOCK,IP,EIP,ICMP,EICMP,TCP,ETCP,UDP,SOCK6,IP6,EIP6,ICMP6,EICMP6和UDP6 ,DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关。它们可以单独或者一起使用。

每间隔1秒统计一次,总计统计1次

        命令

1
sar -n DEV 1 1

        输出

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# sar -n DEV 1 1
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时56分20秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
13时56分21秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时56分21秒 eth0 1.01 1.01 0.06 0.17 0.00 0.00 0.00
平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
平均时间: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: eth0 1.01 1.01 0.06 0.17 0.00 0.00 0.00

        说明

  • #IFACE 本地网卡接口的名称

  • #rxpck/s 每秒钟接受的数据包

  • #txpck/s 每秒钟发送的数据库

  • #rxKB/S 每秒钟接受的数据包大小,单位为KB

  • #txKB/S 每秒钟发送的数据包大小,单位为KB

  • #rxcmp/s 每秒钟接受的压缩数据包

  • #txcmp/s 每秒钟发送的压缩包

  • #rxmcst/s 每秒钟接收的多播数据包

统计网络设备通信失败信息

        命令

1
sar -n EDEV 1 1

        输出

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# sar -n EDEV 1 1
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
13时59分23秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
13时59分24秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13时59分24秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
平均时间: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

        说明

  • #IFACE 网卡名称

  • #rxerr/s 每秒钟接收到的损坏的数据包

  • #txerr/s 每秒钟发送的数据包错误数

  • #coll/s 当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有

  • #rxdrop/s 当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目

  • #txdrop/s 当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目

  • #txcarr/s 当发送数据包的时候,每秒钟载波错误发生的次数

  • #rxfram 在接收数据包的时候,每秒钟发生的帧对其错误的次数

  • #rxfifo 在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数

  • #txfifo 在发生数据包 的时候,每秒钟缓冲区溢出的错误发生的次数

统计socket连接信息

        命令

1
sar -n SOCK 1 1

        输出

1
2
3
4
5
6
[root@localhost ~]# sar -n SOCK 1 1
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
14时02分35秒 totsck tcpsck udpsck rawsck ip-frag tcp-tw
14时02分36秒 389 5 5 0 0 0
平均时间: 389 5 5 0 0 0

        说明

  • #totsck 当前被使用的socket总数

  • #tcpsck 当前正在被使用的TCP的socket总数

  • #udpsck 当前正在被使用的UDP的socket总数

  • #rawsck 当前正在被使用于RAW的skcket总数

  • #if-frag 当前的IP分片的数目

  • #tcp-tw TCP套接字中处于TIME-WAIT状态的连接数量

        如果使用FULL关键字,相当于上述DEV、EDEV和SOCK三者的综合

TCP连接的统计

        命令

1
sar -n TCP 1 3

        输出

1
2
3
4
5
6
7
8
[root@localhost ~]# sar -n TCP 1 3
Linux 2.6.32-431.el6.x86_64 (localhost) 2017年07月12日 _x86_64_ (4 CPU)
14时05分30秒 active/s passive/s iseg/s oseg/s
14时05分31秒 0.00 0.00 0.00 0.00
14时05分32秒 0.00 0.00 1.04 1.04
14时05分33秒 0.00 0.00 1.00 1.00
平均时间: 0.00 0.00 0.68 0.68

        说明

  • #active/s 新的主动连接

  • #passive/s 新的被动连接

  • #iseg/s 接受的段

  • #oseg/s 输出的段

sar -n 使用总结

  • -n DEV : 网络接口统计信息。
  • -n EDEV : 网络接口错误。
  • -n IP : IP数据报统计信息。
  • -n EIP : IP错误统计信息。
  • -n TCP : TCP统计信息。
  • -n ETCP : TCP错误统计信息。
  • -n SOCK : 套接字使用。

常用命令汇总

        因版本和平台不同,有部分命令可能没有或显示结果不一致:

  1. sar -b 5 5 IO传送速率
  2. sar -B 5 5 页交换速率
  3. sar -c 5 5 进程创建的速率
  4. sar -d 5 5 块设备的活跃信息
  5. sar -n DEV 5 5 网路设备的状态信息
  6. sar -n SOCK 5 5 SOCK的使用情况
  7. sar -n ALL 5 5 所有的网络状态信息
  8. sar -P ALL 5 5 每颗CPU的使用状态信息和IOWAIT统计状态
  9. sar -q 5 5 队列的长度(等待运行的进程数)和负载的状态
  10. sar -r 5 5 内存和swap空间使用情况
  11. sar -R 5 5 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)
  12. `sar -u 5 5 CPU的使用情况和IOWAIT信息(同默认监控)
  13. sar -v 5 5 inode, file and other kernel tablesd的状态信息
  14. sar -w 5 5 每秒上下文交换的数目
  15. sar -W 5 5 SWAP交换的统计信息(监控状态同iostat 的si so)
  16. sar -x 2906 5 5 显示指定进程(2906)的统计信息,信息包括:进程造成的错误、用户级和系统级用户CPU的占用情况、运行在哪颗CPU上
  17. sar -y 5 5 TTY设备的活动状态
  18. 将输出到文件(-o)和读取记录信息(-f)